package com.maya.medicalwastes.httpNet;


import com.maya.medicalwastes.bean.DeptEntity;
import com.maya.medicalwastes.bean.FormEntity;
import com.maya.medicalwastes.bean.QueryInfoBean;
import com.maya.medicalwastes.bean.SearchBean;
import com.maya.medicalwastes.bean.TaskOptionEntity;
import com.maya.medicalwastes.bean.WareHouseItemBean;
import com.maya.medicalwastes.bean.WarehouseBean;
import com.maya.medicalwastes.entity.AuthOrgEntity;
import com.maya.medicalwastes.entity.CheckIsShowValuationEntity;
import com.maya.medicalwastes.entity.CollectBean;
import com.maya.medicalwastes.entity.FormCommitEntity;
import com.maya.medicalwastes.entity.FormItemCommitEntity;
import com.maya.medicalwastes.entity.KeyBean;
import com.maya.medicalwastes.entity.MenuEntity;
import com.maya.medicalwastes.entity.QueryNurseInfoBean;
import com.maya.medicalwastes.entity.SpeciUpdateInfoEntity;
import com.maya.medicalwastes.entity.UserEntity;
import com.maya.medicalwastes.entity.WaitWareBean;
import com.maya.medicalwastes.httpNet.model.ResultListNoPageModel;
import com.maya.medicalwastes.httpNet.model.ResultMainHomeModel;
import com.maya.medicalwastes.httpNet.model.ResultModel;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * @description 网络访问接口
 * @user gzl
 * @date 2017/5/31
 * @time 16:05
 */

public interface ApiService {
    /**
     * 下载新版本
     */
    @Streaming
    @GET("update/apps/iPortal/iPortal.apk")
    Observable<ResponseBody> downloadApkCall();

    /**
     * 检查新版本
     */
    @GET("update/apps/iPortal/update.json")
    Observable<ResponseBody> checkNewVersionCall();

    /**
     * 检查新版本（北京卓旭）
     */
    @GET("update/apps/iPortal/zzyupdate.json")
    Observable<ResponseBody> checkNewVersionCallForzzy();

    /**
     * 检查当前型号的新版本
     */
    @POST("public/read/getEnableTerminalList")
    Observable<ResultModel<SpeciUpdateInfoEntity>> checkSpeciVersionCall(@QueryMap Map<String, String> params);

    /**
     * 登陆
     */
    @POST("app/login")
    Observable<ResultModel<String>> loginCall(@QueryMap Map<String, String> params);

    /**
     * 登陆
     */
    @POST("app/smlogin")
    Observable<ResultModel<String>> login(@QueryMap Map<String, String> params);


    /**
     * 扫码获取仓库、垃圾、垃圾桶、转运人等信息
     */
    @POST("sm/queryQrcodeInfo")
    Observable<ResultModel<QueryInfoBean>> queryQrcodeInfo(@QueryMap Map<String, Object> params);

    /**
     * 生成垃圾条码
     */
    @Headers("Content-Type:application/json")
    @POST("barcode/generate/barcode")
    Observable<ResultModel<String>> barcode(@Body Map<String, Object> params,@Query("TOKEN") String token);
 /**
     * 二维码查询列表
     */
    @POST("barcode/generate/page")
    Observable<ResultModel<SearchBean>> page(@QueryMap Map<String, Object> params);
/**
     * 二维码查询列表
     */
    @POST("barcode/state")
    Observable<ResultModel<String>> state(@QueryMap Map<String, Object> params);


    /**
     * 扫码获取仓库、垃圾、垃圾桶、转运人等信息
     */
    @POST("sm/queryQrcodeInfo")
    Observable<ResultModel<CollectBean>> queryQrcodeInfotype(@QueryMap Map<String, Object> params);

    /**
     * 登出
     */
    @POST("app/logout")
    Observable<ResultModel<String>> logoutCall(@QueryMap Map<String, String> params);

    /**
     * 修改密码
     */
    @POST("user/update/centerPassword")
    Observable<ResultModel<Boolean>> alterPasswordCall(@QueryMap Map<String, Object> params);

    /**
     * 获取融云token
     */
    @POST("user/imId")
    Observable<ResultModel<String>> imIdCall(@QueryMap Map<String, Object> params);

    /**
     * 通知护士
     */
    @POST("sysCallTask/read")
    Observable<ResultModel<Boolean>> callNurseCall(@QueryMap Map<String, Object> params);

    /**
     * 更新催单
     */
    @POST("task/updateRemindTask")
    Observable<ResultModel<Boolean>> updateRemindTask(@QueryMap Map<String, Object> params);

    /**
     * 更新催单 new
     *
     * @param params
     * @return 1成功 0失败
     */
    @POST("remind/update")
    Observable<ResultModel<Integer>> updateRemindTaskNew(@QueryMap Map<String, Object> params);

    /**
     * /**
     * 平台及上下班
     */
    @POST("user/attendance")
    Observable<ResultModel<Integer>> userSysAttendanceCall(@QueryMap Map<String, Object> params);

    /**
     * 子系统上下班
     */
    @POST
    Observable<ResultModel<Integer>> childSysAttendance(@Url String path, @QueryMap Map<String, Object> params);

    /**
     * 切换工种 /worker/switchWorkType
     */
    @POST("worker/switchWorkType")
    Observable<ResultModel<Integer>> switchWorkType(@QueryMap Map<String, Object> params);

    /**
     * 获取机构列表
     */
    @POST("public/authOrg/{account}")
    Observable<ResultListNoPageModel<AuthOrgEntity>> getOrgListCall(@Path("account") String account);

    /**
     * 获取常主页菜单列表
     */
    @POST("user/read/current")
    Observable<ResultMainHomeModel<UserEntity, MenuEntity, AuthOrgEntity>> getMenuListCall(@QueryMap Map<String, Object> params);

    /**
     * 获取常主页菜单列表
     */
    @POST("sm/queryNurseInfo")
    Observable<ResultModel<QueryNurseInfoBean>> queryNurseInfo(@QueryMap Map<String, Object> params);

    /**
     * 检查是否是上班状态
     */
    @POST("user/checkAttendance")
    Observable<ResultModel<Boolean>> checkAttendanceCall(@QueryMap Map<String, Object> params);

    /**
     * 二维码分类
     */
    @POST("/public/read/key")
    Observable<ResultModel<ArrayList<KeyBean>>> Keyword(@QueryMap Map<String, Object> params);

    /**
     * 获取机构下所有仓库
     */
    @POST("organ/queryWarehouseBy")
    Observable<ResultModel<ArrayList<WareHouseItemBean>>> queryWarehouseBy(@QueryMap Map<String, Object> params);

    /**
     * 待入库查询列表
     */
    @POST("collect/waitWarehousingList")
    Observable<ResultModel<WaitWareBean>> waitWarehousingList(@Body Map<String, Object> params, @Query("TOKEN") String token);

    /**
     * 待入库查询列表
     */
    @POST("collect/queryByPage")
    Observable<ResultModel<WaitWareBean>> queryByPage(@Body Map<String, Object> params, @Query("TOKEN") String token);

    /**
     * APP当前库存
     */
    @POST("collect/currentStock")
    Observable<ResultModel<WaitWareBean>> currentStock(@Body Map<String, Object> params, @Query("TOKEN") String token);

    /**
     * 出库
     */
    @POST("collect/updateWarehouseOut")
    Observable<ResultModel<String>> updateWarehouseOut(@Body Map<String, Object> params, @Query("TOKEN") String token);

    /**
     * 一件出库列表
     */
    @POST("collect/queryByWarehouse")
    Observable<ResultModel<WaitWareBean>> queryByWarehouse(@QueryMap Map<String, Object> params);

    /**
     * 首页判断是否显示计价
     */
    @POST("public/read/paramKey")
    Observable<ResultModel<CheckIsShowValuationEntity>> checkIsShowValuation(@QueryMap Map<String, Object> params);

    /**
     * 按桶出库列表
     */
    @POST("collect/queryByTrash")
    Observable<ResultModel<WaitWareBean>> queryByTrash(@QueryMap Map<String, Object> params);

    /**
     * 确认上传
     */
    @POST("collect/batch/save")
    Observable<ResultModel<String>> save(@Body Map<String, Object> params, @Query("TOKEN") String token);

    /**
     * 确认上传
     */
    @POST("collect/updateBoxAndBag")
    Observable<ResultModel<String>> updateBoxAndBag(@Body Map<String, Object> params, @Query("TOKEN") String token);

    /**
     * 入库
     */
    @POST("collect/updateWarehouseState")
    Observable<ResultModel<String>> updateWarehouseState(@Body Map<String, Object> params, @Query("TOKEN") String token);


    /**
     * 获取科室列表
     */
    @GET("task/getTaskDeptList")
    Observable<ResultModel<ArrayList<DeptEntity>>> getDeptListCall(@QueryMap Map<String, Object> params);

    /**
     * 病员执行任务
     */
    @POST("task/executePatient")
    Observable<ResultModel<Integer>> executePatientTaskCall(@QueryMap Map<String, Object> params);

    /**
     * 创建返回任务
     */
    @POST("task/createBack")
    Observable<ResultModel<Integer>> createSendBackCall(@QueryMap Map<String, Object> params);


    /**
     * 完成任务
     */
    @POST("task/worker/finish")
    Observable<ResultModel<Integer>> finishTaskCall(@QueryMap Map<String, Object> params);


    /**
     * 获取定位详情
     */
    @POST("public/read/orgLocationDetail")
    Observable<ResultModel<AuthOrgEntity>> getOrgLocationDetailCall(@QueryMap Map<String, Object> params);

    /**
     * 获取融云token
     */
    @GET("valuation/price/read/count")
    Observable<ResultModel<Double>> getValuationPriceCall(@QueryMap Map<String, Object> params);


    @POST("param/getParam")
    Observable<ResultModel<String>> getParam(@QueryMap Map<String, Object> params);


    /**
     * 点击送回按钮：
     * /task/distributeTask?id={taskRecordId}&isFather=false&executor=工人id
     * 1成功跳到子任务列表 0失败 操作失败请提示
     */
    @POST("task/distributeTask")
    Observable<ResultModel<Integer>> executePickPatient(@QueryMap Map<String, Object> params);


    @GET("flow/taskRecord/checkFlowRecord")
    Observable<ResultModel<String>> checkFlowCode(@QueryMap Map<String, Object> params);

    /**
     * 流程型任务执行接口
     */
    @POST("flow/taskRecord/executeTaskRecord")
    Observable<ResultModel<Integer>> executeFlowTask(@QueryMap Map<String, Object> params);


    /**
     * 获取四大块的模板选项的接口
     * Iflow/mould/getFlowMouldByMoudleId
     * 参数：
     * Moudle:模块的id(枚举类中的)
     * orgId:机构id
     */
    @GET("iflow/mould/getFlowMouldByMoudleId")
    Observable<ResultModel<List<TaskOptionEntity>>> getFlowMouldByMoudleId(@QueryMap Map<String, Object> params);

    /**
     * 派发终末任务的接口flow/kino/createKinoTask
     * 参数：
     * name:上面那个接口获取的name（暂定）
     * moudle:枚举类中的value 终末是1
     * object:对象的id，在终末中就是床的id
     * planTime:预约时间这个和运送型任务一样
     * orgId:机构id
     * MouldId:任务模板的id ，就是你选中的那个选项的id
     * sourceType:pad端为3  这个和运送型任务也一样
     * remark:备注
     */
    @POST("flow/task/createFlowTask")
    Observable<ResultModel<Integer>> createFlowTask(@QueryMap Map<String, Object> params);

    @POST("form/mould/forminfo")
    Observable<ResultModel<FormEntity>> getFormInfo(@QueryMap Map<String, Object> params);

    @POST("form/mould/newForminfo")
    Observable<ResultModel<FormEntity>> getNewFormInfo(@QueryMap Map<String, Object> params);

    //提交表单 1成功0失败
    @POST("form/formItems/submitFormItems")
    Observable<ResultModel<Integer>> commitForm(@Body List<FormCommitEntity> lists, @QueryMap Map<String, Object> params);
//    Observable<ResultModel<Integer>> commitForm(@Body RequestBody body, @QueryMap Map<String, Object> params);

    @POST("form/formItems/newSubmitFormItems")
    Observable<ResultModel<Integer>> newCommitForm(@Body List<FormItemCommitEntity> lists, @QueryMap Map<String, Object> params);

    /**
     * /space/rfid/unbind?id=&TOKEN= （返回结果和之前一样）
     */
    @POST("space/rfid/unbind")
    Observable<ResultModel<Integer>> unbindSpaceRfid(@QueryMap Map<String, Object> params);

    /**
     * 解绑：/equip/rfid/unbind?id=&TOKEN= （返回结果和之前一样）
     */
    @POST("equip/rfid/unbind")
    Observable<ResultModel<Integer>> unbindDeviceRfid(@QueryMap Map<String, Object> params);

    /**
     * 1.绑定：/space/rfid/bind?TOKEN=&orgId=&spaceId=&rfid=
     */
    @POST("space/rfid/bind")
    Observable<ResultModel<Integer>> bindSpaceRfid(@QueryMap Map<String, Object> params);

    /**
     * /equip/rfid/bind?TOKEN=&orgId=&equipId=&rfid= (返回结果和之前一样)
     */
    @POST("equip/rfid/bind")
    Observable<ResultModel<Integer>> bindDeviceRfid(@QueryMap Map<String, Object> params);

}
